// import NotFound from "@/views/404/NotFound.vue";
// import LayoutView from "@/views/layout/LayoutView.vue";
// import { createRouter, createWebHistory } from "vue-router";

// const router = createRouter({
//     history: createWebHistory(),
//     routes: [
//         {
//             path: '/',
//             name: 'home',
//             component: LayoutView
//         },
//         { path: '/:pathMatch(.*)*', component: NotFound },
//     ]
// });

// export default router;








import LayoutView from "@/views/layout/LayoutView.vue";
import LoginView from "@/views/login/LoginView.vue";
import type { App } from "vue";
import { useGlobalStore } from "../store/global";
import { createRouter, createWebHistory } from "vue-router";
// import RoleManage from "@/views/role/RoleManage.vue";
// import DoctorManage from "@/views/doctor/DoctorManage.vue";

// 动态生成路由要用：
// 用这种方式，获取到项目中，views文件夹下，所有的.vue文件，不管嵌套多少层
// 得到的是一个对象，{文件路径: 懒加载语法, ...}
const modules = import.meta.glob('../views/**/*.vue');

// 动态生成路由用：
// 把routes的属性值提出来
const routes = [
    { path: '/', redirect: '/admin/index' },
    { path: '/admin/index', component: LayoutView, name: 'LayoutView' },
    { path: '/admin/login', component: LoginView },
    // { path: '/admin/setting/role/list', component: RoleManage },
    // { path: '/admin/data/doctor/list', component: DoctorManage },
    { path: '/:pathMatch(.*)*', component: () => import('@/views/404/NotFound.vue') },
];

// 动态生成路由用：
const router = createRouter({
    history: createWebHistory(),
    routes: routes,
});

// 全局前置守卫【第一步】：判断用户是否登录

// (1) 设置路由白名单：
// 什么是白名单：不需要登录 也可以访问的页面
const white_list = ['/admin/login'];

// (2) 判断用户是否登录：

// router.beforeEach()：全局前置守卫
router.beforeEach(async (to, from) => {
    if (from) {

    }

    // 判断用户是否登录
    const token = localStorage.admin_token;

    // 进if表示：当用户已经登录但还想要进入登录页，就强行跳转到主页
    if (token && to.path == '/admin/login') {
        return '/admin/index';
    }

    // 进入if表示：要去的页面不属于白名单页面 就要判断用户是否登录
    if (!white_list.includes(to.path)) {
        // 近if：没登录，强制去登录
        if (!token) {
            return '/admin/login';
        }
    }

    // 走到这里说明：当前用户 不是白名单(需要登录) 且 已登录

    // 全局前置守卫【第二步】：菜单动态渲染

    // (1) 获取用户最新的权限信息，只要用户进入新页面 或 发任意一个请求 就能拿到用户最新的权限数据

    // 调用use方法 得到仓库对象
    const globalStore = useGlobalStore();
    // 通过仓库对象 拿到仓库对象中的 数据 或 方法
    await globalStore.getAdminInfoByTokenAction();

    // 再菜单组件中 拿到 该用户权限对应的 菜单数据AsideMenu.vue文件中

    // 全局前置守卫【第三步】：动态生成路由

    const permissionData = globalStore.permissionData;

    // 进if表示：该用户要有权限数据，才给它添加路由；避免出现，类似进登录页出现死循环的现象
    if (permissionData.length > 0) {
        // 这个if是为了：控制deepAddRoutes()函数只执行一次，避免出现死循环
        if (router.getRoutes().length === routes.length) {
            deepAddRoutes(permissionData);
            // 动态路由添加好后，手动跳转到它想去的页面；普通路由直接跳就行
            return {
                ...to,
            }
            // return to; // 也可以
        }
    }

});

// 函数作用：根据用户的权限数组，通过addRoute()，递归的、动态的 添加路由
function deepAddRoutes(permissionData: any[]) {
    permissionData.forEach((item: any) => {
        // 进这个if表示：item 需要参与动态路由配置
        if (item.component_path) {
            // LayoutView：父级路由名称
            router.addRoute('LayoutView', {
                path: item.route_path,
                // 先 获取到models对象，再 拿到组件地址
                component: modules[`../views${item.component_path}.vue`]
            });
        }
        // 进这个if表示：item的children 需要参与动态路由配置
        if (item.children) {
            // 递归
            deepAddRoutes(item.children);
        }
    });
}

// 函数作用：跳转到登录页
export function toLogin() {
    localStorage.removeItem('admin_token'); // 删除 admin_token
    router.replace('/admin/login');
}


//（2）暴露路由对象
export function registerRouter(app: App) {
    app.use(router);
};